/*
 * Copyright (c) 2025 Li Auto Inc. and its affiliates
 * Licensed under the Apache License, Version 2.0(the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*!*********************************************************************************************************************
 * @file        Os_Types.h
 * @brief       Os类型定义
 * @details     主要包含Os功能相关的宏定义，结构体定义等
 * @date        2023-3-17
 * @version     V1.0
 * @copyright   Copyright (C) 2015-2024 Lixiang Group Holding Limited
 **********************************************************************************************************************/

#ifndef OS_TYPES_H
#define OS_TYPES_H

#include <nuttx/config.h>
#include <nuttx/sched.h>
#include <nuttx/event.h>
#include "Std_Types.h"

#ifdef __cplusplus
extern "C" {
#endif

/* OS Error Definition */

/* ----- OSEK ----- */
#define E_OS_ACCESS ((StatusType)1) ///< 访问错误，通常指无权限访问资源。
#define E_OS_CALLEVEL ((StatusType)2) ///< 调用级别错误，表示服务调用不在允许的上下文中。
#define E_OS_ID ((StatusType)3) ///< 标识符错误，指示传递给服务的ID不合法。
#define E_OS_LIMIT ((StatusType)4) ///< 限制错误，表示超出了资源或值的限制。
#define E_OS_NOFUNC ((StatusType)5) ///< 无功能错误，指服务请求无法执行。
#define E_OS_RESOURCE ((StatusType)6) ///< 资源错误，指示资源管理相关的错误。
#define E_OS_STATE ((StatusType)7) ///< 状态错误，表示对象的状态不允许该操作。
#define E_OS_VALUE ((StatusType)8) ///< 值错误，指示传递给服务的参数值不合法。

/* ----- AUTOSAR OS ----- */
#define E_OS_SERVICEID ((StatusType)9) ///< 服务ID错误
#define E_OS_ILLEGAL_ADDRESS ((StatusType)10) ///< 非法地址错误
#define E_OS_MISSINGEND ((StatusType)11) ///< 缺少结束标记错误
#define E_OS_DISABLEDINT ((StatusType)12) ///< 禁用中断错误
#define E_OS_STACKFAULT ((StatusType)13) ///< 栈错误
#define E_OS_PROTECTION_MEMORY ((StatusType)14) ///< 内存保护错误
#define E_OS_PROTECTION_TIME ((StatusType)15) ///< 时间保护错误
#define E_OS_PROTECTION_ARRIVAL ((StatusType)16) ///< 到达时间保护错误
#define E_OS_PROTECTION_LOCKED ((StatusType)17) ///< 锁定保护错误
#define E_OS_PROTECTION_EXCEPTION ((StatusType)18) ///< 异常保护错误
#define E_OS_CORE ((StatusType)19) ///< 核心错误
#define E_OS_SPINLOCK ((StatusType)20) ///< 自旋锁错误
#define E_OS_INTERFERENCE_DEADLOCK ((StatusType)21) ///< 干扰死锁错误
#define E_OS_NESTING_DEADLOCK ((StatusType)22) ///< 嵌套死锁错误
#define E_OS_PARAM_POINTER ((StatusType)23) ///< 参数指针错误

/* ----- VCOS Extensions ----- */
#define E_OS_RATE ((StatusType)24) ///< 调用频率错误
#define E_OS_PROTECTION_RATE ((StatusType)25) ///< 保护机制调用频率错误

#define E_OS_TIMEOUT ((StatusType)50) ///< 操作超时
#define E_OS_CRC ((StatusType)51) ///< CRC校验错误
#define E_OS_QUEUE_FULL ((StatusType)52) ///< 队列已满
#define E_OS_QUEUE_EMPTY ((StatusType)53) ///< 队列为空
#define E_OS_QUEUE_OVERWRITTEN ((StatusType)54) ///< 队列数据被覆写
#define E_OS_QUEUE_NOCMPFUNC ((StatusType)55) ///< 队列比较函数未设置
#define E_OS_NOTFOUND ((StatusType)56) ///< 未找到指定元素

#define E_OS_IPICALL_UNAVAILABLE ((StatusType)57) ///< IPI调用不可用
#define E_OS_IPICALL_OVERFLOW ((StatusType)58) ///< IPI调用溢出

#define E_OS_IOC_CHECK_FAILED ((StatusType)60) ///< IOC检查失败
#define E_OS_IOC_LOST_DATA ((StatusType)61) ///< IOC数据丢失
#define E_OS_IOC_NO_DATA ((StatusType)62) ///< IOC无可用数据
#define E_OS_IOC_INVALID_CLASS ((StatusType)63) ///< IOC无效类别
#define E_OS_IOC_UNAVAILABLE ((StatusType)64) ///< IOC不可用

#define E_OS_FIFO_FULL ((StatusType)65) ///< FIFO队列已满
#define E_OS_FIFO_EMPTY ((StatusType)66) ///< FIFO队列为空

#define E_OS_SYS_KILL_KERNEL_OBJ ((StatusType)0xF6) ///< 系统请求终止内核对象
#define E_OS_SYS_NO_RESTARTTASK ((StatusType)0xF7) ///< 无法重启任务

#define E_OS_SYS_NO_NTFSTACK ((StatusType)0xF4) ///< 不可信函数没有可用的栈

#define E_OS_SYS_API_ERROR ((StatusType)0xFC) ///< API使用错误

#define E_OS_ILLEGAL ((StatusType)255) ///< 非法操作

#define INVALID_TASK (0xdeadU) ///< OS无效任务定义
#define INVALID_ISR ((sint16)(-1)) ///< OS无效ISR定义

#define OS_MODULE_ID (0x01U) ///< OS版本ID号

#define MAX_DELAY (0xffffffff) ///< OS 最大延迟

#define OS_RTHP_TASK_TERMINATION (1) ///< 该线程是一个已终止的任务。
#define OS_RTHP_ISR_END (2) ///< 该线程是一个已到达终点的中断服务程序（ISR）。
#define OS_RTHP_TASK_WAITEVENT (4) ///< 该线程是一个等待事件的任务。
#define OS_RTHP_TASK_WAITSEMA (8) ///< 该线程是一个等待信号量的任务。
#define OS_RTHP_THREAD_PREEMPT (16) ///< 该线程是一个被优先级更高的任务或中断服务程序（ISR）中断的任务或中断服务程序
#define OS_RTHP_TASK_ACTIVATION (1)
#define OS_RTHP_ISR_START (2) ///< 该线程是一个将从其起始地址开始的中断服务程序（ISR）
#define OS_RTHP_TASK_SETEVENT (4) ///< 该线程是一个刚刚收到其等待的事件的任务。
#define OS_RTHP_TASK_GOTSEMA (8) ///< 该线程是一个已获取其等待的信号量的任务。
#define OS_RTHP_THREAD_RESUME (16) ///< 该线程是一个之前被抢占的任务或中断服务程序（ISR），现在重新开始运行。
#define OS_RTHP_THREAD_CLEANUP (32) ///< 在线程被强制终止后，操作系统内部会调用线程清理代码。
#define OS_RTHP_CAT2INTERRUPTS (1) ///< 所有第二类中断服务程序（ISR）已通过改变当前中断级别而被启用/禁用。
#define OS_RTHP_ALLINTERRUPTS (2) ///< 所有中断服务程序（ISRs）已通过全局中断使能/禁用标志来启用/禁用。

/*!*********************************************************************************************************************
 * @brief       Autosar基础函数返回值
 **********************************************************************************************************************/
typedef enum {
	/* ---- AUTOSAR OS ----- */
	OSServiceId_GetApplicationID = 0x00u, ///< GetApplicationID()
	OSServiceId_GetISRID = 0x01u, ///< GetISRID()
	OSServiceId_CallTrustedFunction = 0x02u, ///< CallTrustedFunction()
	OSServiceId_CallNonTrustedFunction = 0x03u, ///< CallNonTrustedFunction()
	OSServiceId_CheckObjectAccess = 0x05u, ///< CheckObjectAccess()
	OSServiceId_CheckObjectOwnership = 0x06u, ///< CheckObjectOwnership()
	OSServiceId_StartScheduleTableRel = 0x07u, ///< StartScheduleTableRel()
	OSServiceId_StartScheduleTableAbs = 0x08u, ///< StartScheduleTableAbs()
	OSServiceId_StopScheduleTable = 0x09u, ///< StopScheduleTable()
	OSServiceId_NextScheduleTable = 0x0au, ///< NextScheduleTable()
	OSServiceId_StartScheduleTableSynchron = 0x0bu, ///< StartScheduleTableSynchron()
	OSServiceId_SyncScheduleTable = 0x0cu, ///< SyncScheduleTable()
	OSServiceId_SetScheduleTableAsync = 0x0du, ///< SetScheduleTableAsync()
	OSServiceId_GetScheduleTableStatus = 0x0eu, ///< GetScheduleTableStatus()
	OSServiceId_IncrementCounter = 0x0fu, ///< IncrementCounter()
	OSServiceId_GetCounterValue = 0x10u, ///< GetCounterValue()
	OSServiceId_GetElapsedValue = 0x11u, ///< GetElapsedValue()
	OSServiceId_TerminateApplication = 0x12u, ///< TerminateApplication()
	OSServiceId_AllowAccess = 0x13u, ///< AllowAccess()
	OSServiceId_GetApplicationState = 0x14u, ///< GetApplicationState()
	OSServiceId_GetNumberOfActivatedCores = 0x15u, ///< GetNumberOfActivatedCores()
	OSServiceId_GetCoreID = 0x16u, ///< GetCoreID()
	OSServiceId_StartCore = 0x17u, ///< StartCore()
	OSServiceId_GetSpinlock = 0x19u, ///< GetSpinlock()
	OSServiceId_ReleaseSpinlock = 0x1au, ///< ReleaseSpinlock()
	OSServiceId_TryToGetSpinlock = 0x1bu, ///< TryToGetSpinlock()
	OSServiceId_ShutdownAllCores = 0x1cu, ///< ShutdownAllCores()
	OSServiceId_IocSend = 0x1eu, ///< IocSend()
	OSServiceId_IocWrite = 0x1fu, ///< IocWrite()
	OSServiceId_IocSendGroup = 0x20u, ///< IocSendGroup()
	OSServiceId_IocWriteGroup = 0x21u, ///< IocWriteGroup()
	OSServiceId_IocReceive = 0x22u, ///< IocReceive()
	OSServiceId_IocRead = 0x23u, ///< IocRead()
	OSServiceId_IocReceiveGroup = 0x24u, ///< IocReceiveGroup()
	OSServiceId_IocReadGroup = 0x25u, ///< IocReadGroup()
	OSServiceId_IocEmptyQueue = 0x26u, ///< IocEmptyQueue()
	OSServiceId_GetCurrentApplicationID = 0x27u, ///< GetCurrentApplicationID()
	OSServiceId_GetElapsedValue_NoCheck = 0x28u, ///< GetElapsedValue_NoCheck()
	OSServiceId_GetHookInfo = 0x29u, ///< GetHookInfo()
	/* ----- OS Extensions ----- */
	OSServiceId_GetTickCount = 0xA0u, ///< GetTickCount()
	OSServiceId_DelayTask = 0xA1u, ///< DelayTask()
	OSServiceId_DeviateScheduleTable = 0xA2u, ///< DeviateScheduleTable()
	OSServiceId_NextScheduleTableFromStop = 0xA3u, ///< NextScheduleTableFromStop()
	OSServiceId_SetScheduleTableAppId = 0xA4u, ///< SetScheduleTableAppId()
	OSServiceId_ClearScheduleTableAppId = 0xA5u, ///< ClearScheduleTableAppId()

	/* ----- OSEK ----- */
	OSServiceId_StartOS = 0xD0u, ///< StartOS()
	OSServiceId_GetActiveApplicationMode = 0xD2u, ///< GetActiveApplicationMode()
	OSServiceId_DisableAllInterrupts = 0xD3u, ///< DisableAllInterrupts()
	OSServiceId_EnableAllInterrupts = 0xD4u, ///< EnableAllInterrupts()
	OSServiceId_SuspendAllInterrupts = 0xD5u, ///< SuspendAllInterrupts()
	OSServiceId_ResumeAllInterrupts = 0xD6u, ///< ResumeAllInterrupts()
	OSServiceId_SuspendOSInterrupts = 0xD7u, ///< SuspendOSInterrupts()
	OSServiceId_ResumeOSInterrupts = 0xD8u, ///< ResumeOSInterrupts()
	OSServiceId_ActivateTask = 0xD9u, ///< ActivateTask()
	OSServiceId_TerminateTask = 0xDAu, ///< TerminateTask()
	OSServiceId_ChainTask = 0xDBu, ///< ChainTask()
	OSServiceId_GetTaskID = 0xDCu, ///< GetTaskID()
	OSServiceId_GetTaskState = 0xDDu, ///< GetTaskState()
	OSServiceId_Schedule = 0xDEu, ///< Schedule()
	OSServiceId_SetEvent = 0xDFu, ///< SetEvent()
	OSServiceId_ClearEvent = 0xE0u, ///< ClearEvent()
	OSServiceId_GetEvent = 0xE1u, ///< GetEvent()
	OSServiceId_WaitEvent = 0xE2u, ///< WaitEvent()
	OSServiceId_GetAlarmBase = 0xE3u, ///< GetAlarmBase()
	OSServiceId_GetAlarm = 0xE4u, ///< GetAlarm()
	OSServiceId_SetRelAlarm = 0xE5u, ///< SetRelAlarm()
	OSServiceId_SetAbsAlarm = 0xE6u, ///< SetAbsAlarm()
	OSServiceId_CancelAlarm = 0xE7u, ///< CancelAlarm()
	OSServiceId_GetResource = 0xE8u, ///< GetResource()
	OSServiceId_ReleaseResource = 0xE9u, ///< ReleaseResource()
	OSServiceId_EnableInterruptSource = 0xEAu, ///< EnableInterruptSource()
	OSServiceId_DisableInterruptSource = 0xEBu, ///< DisableInterruptSource()
	OSServiceId_ClearPendingInterrupt = 0xECu, ///< ClearPendingInterrupt()

	OSSERVICEID_COUNT = 0xFF
} OSServiceIdType;

#define OS_STATUS_TYPE_VARIANT(Status, Variant)                                                                        \
	((uint32)(((uint32)(Variant)) << (sizeof(StatusType) * 8u)) | (uint32)(Status)) ///< 创建一个状态码的变体

/*!*********************************************************************************************************************
 * @brief       VCOS特定详细错误码。
 * @details     最低的8位用于AUTOSAR/OSEK状态码。较高位用于详细信息。
 **********************************************************************************************************************/
typedef enum {
	/* ----- OSEK ----- */
	OS_STATUS_OK = E_OK, ///< VCOS特定的详细错误代码。

	OS_STATUS_CALLEVEL = E_OS_CALLEVEL, ///< 无效的调用上下文。

	OS_STATUS_LIMIT = E_OS_LIMIT, ///< 达到最大任务激活次数。

	OS_STATUS_RESOURCE = E_OS_RESOURCE, ///< 请求调度时资源已占用。

	OS_STATUS_SERVICEID = E_OS_SERVICEID, ///< 无法调用该服务。

	OS_STATUS_ILLEGAL_ADDRESS = E_OS_ILLEGAL_ADDRESS, ///< 给定的参数地址无效。

	OS_STATUS_MISSINGEND = E_OS_MISSINGEND, ///< 任务在没有调用TerminateTask或ChainTask的情况下终止

	OS_STATUS_DISABLEDINT = E_OS_DISABLEDINT, ///< 在禁用/启用中断对内调用了操作系统
	OS_STATUS_STACKFAULT = E_OS_STACKFAULT, ///< 通过操作系统的堆栈监控检测到堆
	OS_STATUS_PROTECTION_MEMORY = E_OS_PROTECTION_MEMORY, ///< 发生内存访问
	OS_STATUS_PROTECTION_TIME = E_OS_PROTECTION_TIME, ///< 任务/中断服务程序超出了其执行时
	OS_STATUS_PROTECTION_ARRIVAL = E_OS_PROTECTION_ARRIVAL, ///< 任务/中断服务程序在其时间帧到期之
	OS_STATUS_PROTECTION_LOCKED = E_OS_PROTECTION_LOCKED, ///< 任务/第2类中断服务程序阻塞时
	OS_STATUS_PROTECTION_EXCEPTION = E_OS_PROTECTION_EXCEPTION, ///< 发生
	OS_STATUS_CORE = E_OS_CORE, ///< 核心
	OS_STATUS_SPINLOCK = E_OS_SPINLOCK, ///< 在占用的自旋锁上取
	OS_STATUS_INTERFERENCE_DEADLOCK = E_OS_INTERFERENCE_DEADLOCK, ///< 由干扰引起的死
	OS_STATUS_NESTING_DEADLOCK = E_OS_NESTING_DEADLOCK, ///< 由于错误的嵌套可能导
	/* OS_STATUS_PARAM_POINTER                     = E_OS_PARAM_POINTER, */ ///< 参数为nul
	OS_STATUS_IOC_CHECK_FAILED = E_OS_IOC_CHECK_FAILED, ///< IOC检
	OS_STATUS_IOC_LOST_DATA = E_OS_IOC_LOST_DATA, ///< IOC数
	OS_STATUS_IPICALL_UNAVAILABLE = E_OS_IPICALL_UNAVAILABLE, ///< IPICall调用函
	OS_STATUS_IPICALL_OVERFLOW = E_OS_IPICALL_OVERFLOW, ///< IPICall发送缓冲
	OS_STATUS_API_ERROR = E_OS_SYS_API_ERROR, ///< 错误的AP
	OS_STATUS_KILL_KERNEL_OBJ = E_OS_SYS_KILL_KERNEL_OBJ, ///< 请求强制终止内
	OS_STATUS_NO_RESTARTTASK = E_OS_SYS_NO_RESTARTTASK, ///< 请求重新启动应用程序，但未配置重新启动任务

	OS_STATUS_CALLEVEL_SHARED_STACK = (OS_STATUS_TYPE_VARIANT(E_OS_CALLEVEL, 1u)), ///< 调用上下文无效。

	OS_STATUS_CALLEVEL_CROSS_CORE_SYNC = (OS_STATUS_TYPE_VARIANT(E_OS_CALLEVEL, 2u)), ///< 调用上下文无效。

	OS_STATUS_ACCESSRIGHTS_1 = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 1u)), ///< 参数1中指定对象无访问权限

	OS_STATUS_ACCESSRIGHTS_2 = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 2u)), ///< 参数2中指定对象无访问权限

	OS_STATUS_NOTACCESSIBLE_1 =	(OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 3u)), ///< 参数1中指定的对象的应用程序状态不可访问

	OS_STATUS_NOTACCESSIBLE_2 =	(OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 4u)), ///< 参数2中指定的对象的应用程序状态不可访问

	OS_STATUS_NOEXTENDEDTASK_1 = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 5u)), ///< 参数1中给定的ID不属于扩展任务。

	OS_STATUS_NOEXTENDEDTASK_2 = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 6u)), ///< 参数2中给定的ID不属于扩展任务。

	OS_STATUS_NOEXTENDEDTASK_CALLER = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 7u)), ///< 调用者不是扩展任务。

	OS_STATUS_LOCKED = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 8u)), ///< 给定的锁已经被锁定。

	OS_STATUS_PRIORITY = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 9u)), ///< 给定的对象具有无效的优先级。

	OS_STATUS_NOT_THE_OWNER_1 = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 10u)), ///< 调用者不是参数1中访问对象的所有者。

	OS_STATUS_TIMEOUT = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 11u)), ///< 消息队列发送超时。

	OS_STATUS_NOT_OK = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 12u)), ///< 一般错误代码。

	OS_STATUS_IPICALL_NOT_OK = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 13u)), ///< IPICall通用错误代码。

	OS_STATUS_IPICALL_TIMEOUT = (OS_STATUS_TYPE_VARIANT(E_OS_ACCESS, 14u)), ///< IPICall发送超时。

	OS_STATUS_ID_1 = (OS_STATUS_TYPE_VARIANT(E_OS_ID, 1u)), ///< 参数1中给定的ID无效。

	OS_STATUS_ID_2 = (OS_STATUS_TYPE_VARIANT(E_OS_ID, 2u)), ///< 参数2中给定的ID无效。

	OS_STATUS_ID_TYPE_1 = (OS_STATUS_TYPE_VARIANT(E_OS_ID, 3u)), ///< 参数1中给定的类型无效。

	OS_STATUS_ID_DIFFERENT_COUNTER = (OS_STATUS_TYPE_VARIANT(E_OS_ID, 4u)), ///< 给定对象的类型分配到不同的计数器。

	OS_STATUS_ID_DIFFERENT_SYNC = (OS_STATUS_TYPE_VARIANT(E_OS_ID, 5u)), ///< 给定对象的类型具有不同的同步类型。

	OS_STATUS_HOOK_NOT_AVAILABLE = (OS_STATUS_TYPE_VARIANT(E_OS_ID, 6u)), ///< 请求的钩子不可用。

	OS_STATUS_IPICALL_ID_1 = (OS_STATUS_TYPE_VARIANT(E_OS_ID, 7u)), ///< 参数1中给定的IPICall ID无效

	OS_STATUS_UNLOCKED = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 1u)), ///< 操作系统对象当前处于解锁状态。

	OS_STATUS_NOFUNC_1 = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 2u)), ///< 参数1中给定的操作系统对象当前未被使用。

	OS_STATUS_NOFUNC_2 = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 3u)), ///< 参数2中给定的操作系统对象当前未被使用。

	OS_STATUS_SPINLOCK_ORDER = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 4u)), ///< 参数1中给定的操作系统对象当前未被使用。

	OS_STATUS_STOPPED_1 = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 5u)), ///< 参数1中给定的操作系统对象当前停止。

	OS_STATUS_NOT_STOPPED_2 = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 6u)), ///< 参数2中给定的操作系统对象当前未停止。

	OS_STATUS_NEXTED_1 = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 7u)), ///< 参数1中给定的操作系统对象当前处于嵌套状态

	OS_STATUS_KILLING_IS_DISABLED = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 8u)), ///< 禁用杀死时不允许操作。

	OS_STATUS_ORDER = (OS_STATUS_TYPE_VARIANT(E_OS_NOFUNC, 9u)), ///< 操作系统对象的访问顺序错误。

	OS_STATUS_STATE_1 = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 1u)), ///< 操作系统对象不处于执行请求操作的正确状态

	OS_STATUS_STATE_2 = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 2u)), ///< 操作系统对象不处于执行请求操作的正确状态

	OS_STATUS_STATE_STOPPED = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 3u)), ///< 操作系统对象处于停止状态，不允许执行请求的操作

	OS_STATUS_STATE_RUNNING = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 4u)), ///< 操作系统对象处于运行状态，不允许执行请求的操作

	OS_STATUS_STATE_NEXTED = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 5u)), ///< 操作系统对象处于下一个状态，不允许执行请求操作

	OS_STATUS_STATE_WAITING = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 6u)), ///< 操作系统对象处于等待状态，不允许执行请求的操作

	OS_STATUS_STATE_NO_RESTART = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 7u)), ///< 当前应用程序不处于重新启动状态。

	OS_STATUS_STATE_ALREADY_TERMINATED = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 8u)), ///< 请求终止已经终止的应用程序。

	OS_STATUS_STATE_RESTARTING_NO_MEMBER = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 9u)), ///< 应用程序正在重新启动，并且调用者不属该应用程序

	OS_STATUS_STATE_ALREADY_RESTARTING = (OS_STATUS_TYPE_VARIANT(E_OS_STATE, 10u)), ///< 请求重新启动已经正在重新启动的应用程序。

	OS_STATUS_VALUE_IS_ZERO_1 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 1u)), ///< 参数1中给定的值为零。

	OS_STATUS_VALUE_IS_ZERO_2 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 2u)), ///< 参数2中给定的值为零。

	OS_STATUS_VALUE_IS_TOO_HIGH_1 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 3u)), ///< 参数1中给定的值过高。

	OS_STATUS_VALUE_IS_TOO_HIGH_2 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 4u)), ///< 参数2中给定的值过高。

	OS_STATUS_VALUE_IS_TOO_HIGH_3 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 5u)), ///< 参数3中给定的值过高。

	OS_STATUS_VALUE_IS_OUT_OF_BOUNDS_1 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 6u)), ///< 参数1中给定的值超出了范围。

	OS_STATUS_VALUE_IS_OUT_OF_BOUNDS_2 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 7u)), ///< 参数2中给定的值超出了范围。

	OS_STATUS_VALUE_IS_TOO_LOW_1 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 8u)), ///< 参数1中给定的值过低。

	OS_STATUS_VALUE_IS_TOO_LOW_2 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 9u)), ///< 参数2中给定的值过低。

	OS_STATUS_VALUE_IS_TOO_LOW_3 = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 10u)), ///< 参数3中给定的值过低。

	OS_STATUS_VALUE_IS_NOT_BOOLEAN = (OS_STATUS_TYPE_VARIANT(E_OS_VALUE, 11u)), ///< 参数2中给定的值必须为TRUE或FALSE。

	OS_STATUS_CORE_CROSS_DATA = (OS_STATUS_TYPE_VARIANT(E_OS_CORE, 1u)), ///< 跨核请求的接收方收到的数据无效。

	OS_STATUS_PARAM_POINTER_1 = (OS_STATUS_TYPE_VARIANT(E_OS_PARAM_POINTER, 1u)), ///< 参数1中给定的指针为null。

	OS_STATUS_PARAM_POINTER_2 = (OS_STATUS_TYPE_VARIANT(E_OS_PARAM_POINTER, 2u)), ///< 参数2中给定的指针为null。

	OS_STATUS_PARAM_POINTER_3 = (OS_STATUS_TYPE_VARIANT(E_OS_PARAM_POINTER, 3u)), ///< 参数3中给定的指针为null。

	OS_STATUS_NO_NTFSTACK_POOL_EMPTY = (OS_STATUS_TYPE_VARIANT(E_OS_SYS_NO_NTFSTACK, 1u)), ///< 没有多余的栈给不可信函数使用

	OS_STATUS_NO_NTFSTACK_APPLIMIT_EXCEEDED = (OS_STATUS_TYPE_VARIANT(E_OS_SYS_NO_NTFSTACK, 2u)), ///< 当前App已超过调用不可信函数的次数

	OS_STATUS_IPICALL_PARAM_POINTER_1 = (OS_STATUS_TYPE_VARIANT(E_OS_PARAM_POINTER, 4u)), ///< 参数1中给定的IPICall指针为null。

	OS_STATUS_IPICALL_PARAM_POINTER_2 =	(OS_STATUS_TYPE_VARIANT(E_OS_PARAM_POINTER, 5u)), ///< 参数2中给定的IPICall指针为null。

	OS_STATUS_IPICALL_PARAM_POINTER_3 =	(OS_STATUS_TYPE_VARIANT(E_OS_PARAM_POINTER, 6u)), ///< 参数3中给定的IPICall指针为null。
} Os_StatusType;

/* Global Type & Structure Definition */

typedef uint32_t CoreIdType;

/*!*********************************************************************************************************************
 * @brief       数据类型表示一个Tick
 **********************************************************************************************************************/
typedef uint32 *TickRefType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个中断服务程序（ISR）。
 **********************************************************************************************************************/
typedef sint16 isr_id_t;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个中断服务程序（ISR）的优先级。
 **********************************************************************************************************************/
typedef uint32 OsISRPrioType;

typedef void (*TaskFunction_t)(void *);

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个中断服务程序（ISR）的入口函数。
 **********************************************************************************************************************/
typedef void (*ISRFunction_t)(void);

/*!*********************************************************************************************************************
 * @brief       这个引用类型表示一个中断服务函数。
 **********************************************************************************************************************/
typedef ISRFunction_t OSISRFunctionType;

/*!*********************************************************************************************************************
 * @brief       这种数据类型表示一个任务状态。.
 **********************************************************************************************************************/
typedef enum {
	TASK_STATE_RUNNING, ///< 任务正在查询自身的状态，因此必须是运行状态。
	TASK_STATE_READY, ///< 被查询的任务在读或待准备列表中。
	TASK_STATE_WAITING, ///< 被查询的任务处于阻塞状态。
	TASK_STATE_SUSPENDED, ///< 被查询的任务处于挂起状态，或者处于阻塞状态且超时时间为无限。
	TASK_STATE_DELETED, ///< 被查询的任务已被删除，但其TCB尚未被释放。
	TASK_STATE_INVALID, ///< 用作“无效状态”值。
} TaskStateType;

/*!*********************************************************************************************************************
 * @brief       应用程序访问状态
 **********************************************************************************************************************/
typedef enum {
	APPLICATION_TERMINATED = 0, ///< 应用程序已终止且不可访问。
	APPLICATION_RESTARTING, ///< 应用程序处于重新启动阶段且不可访问。
	APPLICATION_ACCESSIBLE ///< 应用程序处于活动状态且可访问。
} ApplicationStateType;

/*!*********************************************************************************************************************
 * @brief       任务类型
 **********************************************************************************************************************/
typedef enum {
	OBJECT_TASK, ///< 提供的对象是一个任务。
	OBJECT_ISR, ///< 提供的对象是一个中断服务程序（ISR）。
	OBJECT_COUNTER, ///< 提供的对象是一个计数器。
	OBJECT_SCHEDULETABLE, ///< 提供的对象是一个调度表。
} ObjectTypeType;

typedef uint32 StackType_t;

/*!*********************************************************************************************************************
 * @brief       操作系统OS对象的标识符。
 **********************************************************************************************************************/
typedef uint32 Os_ObjectIdType;

/*!*********************************************************************************************************************
 * @brief       操作系统对象的标识符引用。
 **********************************************************************************************************************/
typedef uint32 ObjectIdType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个应用程序模式。
 **********************************************************************************************************************/
typedef uint8 AppModeType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个任务标识符。
 **********************************************************************************************************************/
typedef uint16 TaskType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个hook标识符。
 **********************************************************************************************************************/
typedef uint32 HookIdType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个hook 标志位。
 **********************************************************************************************************************/
typedef uint32 HookFlagType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个任务引用类型
 **********************************************************************************************************************/
typedef TaskType *TaskRefType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示 FreeRTOS 中的任务句柄。
 **********************************************************************************************************************/
typedef struct tcb_s *OsTaskHdlType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示系统时钟。
 **********************************************************************************************************************/
typedef uint32 TickType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示时间的差异，用于调度表时间的正负转换。
 **********************************************************************************************************************/
typedef sint32 TickDiffType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个任务优先级。
 **********************************************************************************************************************/
typedef uint32 OsTaskPrioType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个任务堆栈大小。
 **********************************************************************************************************************/
typedef uint16 OSTaskStackSizeType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个堆栈大小。
 **********************************************************************************************************************/
typedef uint16 OsStackSizeType;

/*!*********************************************************************************************************************
 * @brief       这个引用类型表示一个任务堆栈地址。
 **********************************************************************************************************************/
typedef uint32 *OSTaskStackAddrType;

/*!*********************************************************************************************************************
 * @brief       这个引用类型表示一个堆栈地址。
 **********************************************************************************************************************/
typedef uint32 *OsStackAddrType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个任务控制块。
 **********************************************************************************************************************/
typedef struct tcb_s OSTaskTCBType;

/*!*********************************************************************************************************************
 * @brief       这个引用类型表示一个任务入口函数。
 **********************************************************************************************************************/
typedef TaskFunction_t OsTaskFunctionType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个事件掩码。
 **********************************************************************************************************************/
typedef nxevent_mask_t os_event_mask_t;
typedef os_event_mask_t EventMaskType;

/*!*********************************************************************************************************************
 * @brief       这个引用类型表示一个事件掩码。
 **********************************************************************************************************************/
typedef nxevent_mask_t *EventMaskRefType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示 FreeRTOS 中的事件组处理程序。
 **********************************************************************************************************************/
typedef nxevent_t *OsTaskEventType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个警报标识符。
 **********************************************************************************************************************/
typedef uint16 AlarmType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个调度表类型。
 **********************************************************************************************************************/
typedef uint16 ScheduleTableType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个计数器类型。
 **********************************************************************************************************************/
typedef uint32 CounterType;

/*!*********************************************************************************************************************
 * @brief       alarm回调函数的函数指针类型
 **********************************************************************************************************************/
typedef void (*AlarmCallbackFunction_t)(void);

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个alarm回调函数。
 **********************************************************************************************************************/
typedef AlarmCallbackFunction_t Os_AlarmCallbackType;

/*!*********************************************************************************************************************
 * @brief       此数据类型表示资源标识符。
 **********************************************************************************************************************/
typedef uint32 ResourceType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一组活动的 CPU。
 **********************************************************************************************************************/
typedef uint32 OSCpuSetType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个自旋锁标识符。
 **********************************************************************************************************************/
typedef uint16 os_spin_id_t;
typedef os_spin_id_t SpinlockIdType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个队列标识符。
 **********************************************************************************************************************/
typedef uint8 QueueType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个 Ioc 标识符。
 **********************************************************************************************************************/
typedef uint32 IocIdType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个服务标识符。
 **********************************************************************************************************************/
typedef OSServiceIdType *OSServiceIdRefType;

#if defined(CONFIG_RT_FRAMEWORK_MULTIAPP) && (CONFIG_RT_FRAMEWORK_MULTIAPP== 1)

/*!*********************************************************************************************************************
 * @brief       这个类型是指向操作系统应用程序的引用。
 **********************************************************************************************************************/
typedef uint8 ApplicationIDType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个应用程序掩码状态。
 **********************************************************************************************************************/
typedef uint32 AccessApplMaskType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个应用程序状态。
 **********************************************************************************************************************/
typedef ApplicationIDType ApplicationType;

/*!*********************************************************************************************************************
 * @brief       这个引用类型表示一个应用程序状态。
 **********************************************************************************************************************/
typedef ApplicationStateType *ApplicationStateRefType;

#endif

/* Global Type & Structure Definition */
typedef uintptr_t int_level_t; /* Interrupt level type */
typedef uintptr_t int_global_state_t; /* Interrupt global state type */
typedef uintptr_t int_vector_num_t; /* Interrupt vector number */
typedef uintptr_t register_t; /* Register type */

typedef int_global_state_t os_int_global_state_t;
typedef int_level_t os_int_level_t;
typedef uint16 os_int_api_cnt_t; // TODO 性能优化可以变为 uint32

/*!*********************************************************************************************************************
 * @brief       可信函数的指针类型
 **********************************************************************************************************************/
typedef uint8 TrustedFunctionType;

/*!*********************************************************************************************************************
 * @brief       可信函数的引用类型
 **********************************************************************************************************************/
typedef void *TrustedFunctionParameterRefType;

/*!*********************************************************************************************************************
 * @brief       不可信函数的指针类型
 **********************************************************************************************************************/
typedef uint8 NonTrustedFunctionType;

/*!*********************************************************************************************************************
 * @brief       不可信函数的引用类型
 **********************************************************************************************************************/
typedef void *NonTrustedFunctionParameterRefType;

/*!*********************************************************************************************************************
 * @brief       追踪或记录线程（或任务）的信息
 **********************************************************************************************************************/
typedef uint16 TraceThreadType;

/*!*********************************************************************************************************************
 * @brief       在初始化期间迭代操作系统对象的索引类型。
 **********************************************************************************************************************/
typedef uint16 OsObjIndexType;

/*!*********************************************************************************************************************
 * @brief       Identifies the current executing context type.
 **********************************************************************************************************************/
typedef uint32_t os_context_id_t;

/*!*********************************************************************************************************************
 * @brief       这个引用类型表示一个任务信息。
 **********************************************************************************************************************/
struct OsTaskStatus {
	uint32 dummy[12];
};

typedef struct OsTaskStatus OsTaskStatusType;

typedef struct {
	OsTaskStatusType OsTaskStatus;
#if defined(CONFIG_RT_FRAMEWORK_MULTIAPP) && (CONFIG_RT_FRAMEWORK_MULTIAPP== 1)
	ApplicationIDType ApplOwnerId;
#endif
} TaskInfoType;

/*!*********************************************************************************************************************
 * @brief       Hook状态的数据类型。
 **********************************************************************************************************************/
struct OsHookStatus {
	HookIdType HookId;
	OSTaskStackSizeType HookStackSize; /*! Task stack size */
	OSTaskStackAddrType HookStackAddr; /*! Hook Task stack address */

#if defined(CONFIG_RT_FRAMEWORK_MULTIAPP) && (CONFIG_RT_FRAMEWORK_MULTIAPP== 1)
	ApplicationIDType ApplOwnerId; /*! Application that owns this task */
#endif
	// coverity[misra_c_2012_rule_20_9_violation:SUPPRESS]
#if (defined(CONFIG_RT_FRAMEWORK_TRACE) && (CONFIG_RT_FRAMEWORK_TRACE == 1)) && (defined(CONFIG_RT_FRAMEWORK_TRACE_HOOK) && (CONFIG_RT_FRAMEWORK_TRACE_HOOK == 1))
	uint32_t ExcuteTickMax;
#if ((CONFIG_RT_FRAMEWORK_TRACE_RUNTIME & CONFIG_RT_FRAMEWORK_TRACE_RUNTIME_LEVEL_WITH_MIN_RESPONSE) != 0)
	uint32_t ExcuteTickMin;
#endif /* (CONFIG_RT_FRAMEWORK_TRACE_RUNTIME & CONFIG_RT_FRAMEWORK_TRACE_RUNTIME_LEVEL_WITH_MIN_RESPONSE) != 0 */
	uint32_t ExcuteTickAvg;
#endif
};

typedef struct OsHookStatus OsHookStatusType;

/*!*********************************************************************************************************************
 * @brief       这个数据类型表示一个Hook状态引用类型。
 **********************************************************************************************************************/
typedef OsHookStatusType *OsHookStatusRefType;

/*!*********************************************************************************************************************
 * @brief       指向MCU地址空间中任何（常量）位置的指针的数据类型。
 **********************************************************************************************************************/
typedef const void *MemoryStartAddressType;

typedef enum ScheduleTableStatus {
	SCHEDULETABLE_STOPPED, ///< 调度表为STOPPED状态
	SCHEDULETABLE_NEXT, ///< 调度表为NEXT状态
	SCHEDULETABLE_WAITING, ///< 调度表为WAITING状态
	SCHEDULETABLE_RUNNING, ///< 调度表为RUNNING状态
	SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS ///< 调度表为RUNNING_AND_SYNCHRONOUS状态
} ScheduleTableStatusType;
typedef ScheduleTableStatusType *ScheduleTableStatusRefType;

/*!*********************************************************************************************************************
 * @brief       此数据类型标识空闲模式行为。
 **********************************************************************************************************************/
typedef enum {
	IDLE_NO_HALT = 0, ///< 核心在空闲时间不执行任何特定操作。
	OS_IDLEMODE_COUNT = 1 ///< 核心在空闲时间执行任何特定操作。
} IdleModeType;

/*!*********************************************************************************************************************
 * @brief       Alarm基本参数的数据类型。
 **********************************************************************************************************************/
struct AlarmBase {
	TickType maxallowedvalue;
	TickType mincycle;
	TickType tickperbase;
};

typedef struct AlarmBase AlarmBaseType;

/*!*********************************************************************************************************************
 * @brief       Alarm基本参数引用的数据类型
 **********************************************************************************************************************/
typedef AlarmBaseType *AlarmBaseRefType;

/*!*********************************************************************************************************************
 * @brief       指示自旋锁是否已被占用。
 **********************************************************************************************************************/
typedef enum {
	TRYTOGETSPINLOCK_SUCCESS, ///< 自旋锁成功占用
	TRYTOGETSPINLOCK_NOSUCCESS ///< 无法占用自旋锁
} try_get_spin_t;

typedef try_get_spin_t TryToGetSpinlockType;

/*!*********************************************************************************************************************
 * @brief       任务的错误信息
 **********************************************************************************************************************/
struct Os_ErrorInfoType {
	OSServiceIdType ServiceId; ///< 服务ID
	StatusType Status; ///< 状态
	Os_StatusType DetailedStatus; ///< 详细状态
};

/*!*********************************************************************************************************************
 * @brief       任务的错误信息
 **********************************************************************************************************************/
typedef struct Os_ErrorInfoType OsErrorInfoType;

#define DeclareConst(_type, _name) const _type _name ///< 声明常量

#define DeclareConstRefTable(_type, _name) const _type _name[] ///< 声明常量引用表

#define OS_OFFSETOF(type, member) offsetof(type, member) ///< 获取结构体成员的偏移量

#define NELEMENTS(array) (sizeof(array) / sizeof((array)[0])) ///< 获取数组元素的个数

#define OS_APPID2MASK(appid) (0x00000001U << (appid)) ///< 获取应用程序ID掩码

#define OS_STRUCT_OBJECT(_type, _id, _number) (_type[_id]._number) ///< 这个函数获取结构体编号

#define OS_LINK_ENTRY_DECLARE(_section, _class, _type, _id)                                                            \
	_type _class##_##_id locate_data(#_section "." #_class "." #_id)

#define OS_TABLE_DECLARE(_section, _class, _type, _id, _size)                                                          \
	_type _class##_##_id[_size / sizeof(_type)] locate_data(#_section "." #_class "." #_id)

#define OS_TABLE_DECLARE_BY_ARRAY_MEMBER(_section, _class, _type, _id, _num)                                           \
	_type _class##_##_id[_num] locate_data(#_section "." #_class "." #_id)

#define OS_REF_TABLE_DECLARE(_class, _id, _size)                                                                       \
	const locate_data(".rodata.Os" #_id "." #_class) OsObjIndexType os_##_id##_cfg_ref_table_size = _size;              \
	const locate_data(".rodata.Os" #_id "." #_class) os_##_id##_cfg_t *const os_##_id##_cfg_ref_table[_size]

#define OS_REF_TABLE_DECLARE_H(_class, _id)                                                                            \
	extern const OsObjIndexType os_##_id##_cfg_ref_table_size;                                                         \
	extern const os_##_id##_cfg_t *const os_##_id##_cfg_ref_table[];

#define OS_LINK_ENTRY_NAME(_class, _id) _class##_##_id

#define OS_TABLE_SIZE_NAME(_class, _id) _class##_##_id##Size

/*! Os configuration reference table declare */
#define DeclareOsRefTable(tableclass, tablesize) OS_REF_TABLE_DECLARE(OsCfgRef, tableclass, tablesize)

#define DeclareOsRefTable_H(tableclass) OS_REF_TABLE_DECLARE_H(OsCfgRef, tableclass)

#ifdef __cplusplus
}
#endif

#endif /* OS_AUTOSAROS_INC_OS_TYPES_H */
